iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Kubernetes

Kubernetes圖解筆記系列 第 4

Day-4 在學習 Kubernetes 之前 - Docker(3)

  • 分享至 

  • xImage
  •  

Docker 的最後一篇 (((o(゚▽゚)o)))


官方文件:Install Docker Desktop on Windows

Install Docker


  1. 下載 & 安裝
    https://ithelp.ithome.com.tw/upload/images/20240905/20168437jOyTgD1Blc.png

  2. 重新啟動(對,又要重啟)
    https://ithelp.ithome.com.tw/upload/images/20240905/20168437CDWOqcIeKs.png

  3. 完成安裝後,會看到一個可可愛愛的安裝詢問畫面
    https://ithelp.ithome.com.tw/upload/images/20240905/20168437K1pLiOLVZ7.png
    就跟每一次的安裝執行一樣。如果他問你 policy,accept 就是了。

  4. 接下來會要求登入,我個人是比較懶... 就直接綁 Google 帳號。
    https://ithelp.ithome.com.tw/upload/images/20240905/20168437WKJQSn5z9o.png

  5. 出現畫面,安裝就完成啦!
    https://ithelp.ithome.com.tw/upload/images/20240905/20168437Z3YeOSlbzk.png


進入正題:建立第一個自己的 image !

build image


在建立 image 之前,總要先有要執行的程式碼。

先附上 GIT路徑
內容很單純,就是一個會印出招呼語的 main.py 檔,要使用專案中的 Dockerfile 把它打包起來。
程式碼就只有這樣:

if __name__ == '__main__':
    print('Hi, This is your new application.')

非常的樸實無華(且無聊),但沒關係,重點是打包!

在專案路徑下執行指令:

docker build -t docker-demo:0.0.1 -f Dockerfile .

(對,就是 README.md 裡面那行。)

  • -t:指定 image 名稱,就是範例中的 docker-demo
  • 名稱格式:<image名稱>:<image版本>
    (隨意自訂版號,3 碼只是個人習慣)
  • -f:執行 file 指令

執行內容如下:
https://ithelp.ithome.com.tw/upload/images/20240905/20168437oOooTZeu75.png
從記錄可以看出在 Dockerfile 內的指令被逐步執行。

完成後透過指令或直接從 Docker Desktop 確認結果:

docker image list
  • command line
    https://ithelp.ithome.com.tw/upload/images/20240905/20168437UlGb4KMO7H.png
  • Docker Desktop
    https://ithelp.ithome.com.tw/upload/images/20240905/20168437IIhXUL7fw6.png

包好了 image ,立刻就來執行看看!
執行指令:

docker run docker-demo:0.0.1

剛才打包起來的程式碼順利地執行成功了~
https://ithelp.ithome.com.tw/upload/images/20240905/20168437GCX0kgJmeH.png

有沒有注意到...

實作到目前為止,都。沒。有。安。裝。過。 python 。環。境 ( ´▽`)
不是因為已經本來就已經安裝好了!(詳見下圖)
https://ithelp.ithome.com.tw/upload/images/20240905/20168437GLjEWTvzFx.png
在成功執行 container 後執行 python --version 的指令,卻看到執行結果空空的,什麼都沒有
container 確實是正常運行的,這是因為執行需要的依賴已經全部都被打包進 image 之中了,即容器化最讚的特性之一:遷移性(或說移植性)非常高!
只要打包好到哪運行都可以,而不必擔心要做各種環境設置。

這就是容器化的魅力啊!!!

... 對了,因為安裝的是 Docker Desktop,所以所有的指令其實都可以用列表最右邊的 Actions 執行,依個人習慣操作即可。 但是下指令就是比較帥(並沒有)
https://ithelp.ithome.com.tw/upload/images/20240905/20168437i5gRaHX51j.png

最後看看打包用的 Dockerfile

相關的說明都直接壓在註解上了。

# 使用 Python 3.11 作為 base image
FROM python:3.11-slim

# 設置工作目錄
WORKDIR /app

# 複製當前目錄的內容到容器中的 /app 目錄
COPY . .

# 安裝 Python 依賴項
# 如果有 requirements.txt 文件,使用它安裝依賴
RUN pip install --no-cache-dir --upgrade pip && \
    if [ -f requirements.txt ]; then pip install --no-cache-dir -r requirements.txt; fi

# 指定要執行的命令
CMD ["python", "main.py"]

這時候可能會出現一個疑問:啊你 Demo 就弄個 Hello World?

開發都是寫 API 的啊!!!

這不就來了嗎~
一樣,上 GIT路徑
FastAPI 來試一下:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def hi_fastapi():
    return "Hi, it's your FastAPI Service!"

打包 image 的指令一模一樣,就是改個名稱而已:

docker build -t docker-demo-api:0.0.1 -f Dockerfile .

執行結果如下:
https://ithelp.ithome.com.tw/upload/images/20240905/2016843745waJWEFsM.png

如果不改名也不改版號會怎麼樣?

其實也不會怎麼樣,名字和版號都會變成新的 image 在使用。
原本舊版的 image 不會被覆蓋或刪除,但是 REPOSITORY 和 TAG 都會變成 <none>,時間久了就會變得難以識別。

執行剛打包好的 image

docker run -dp 8080:8080 docker-demo-api:0.0.1

指令看起來跟剛剛不太一樣

  • -d:參數,使應用程式背景執行
  • -p:即 port-p 8080:8080 是設定把主機收到的 8080 流量都轉到 container EXPOSE 的 8080 port 上。
    格式是主機 port:container port
    覺得不好理解就直接看圖,藍色箭頭的位置就是指令設定的地方。
    https://ithelp.ithome.com.tw/upload/images/20240905/20168437aXgaiFJ7oE.png

最後來測試看看結果:
https://ithelp.ithome.com.tw/upload/images/20240905/20168437Rw5NEc1cKu.png

附上打包用的 Dockerfile

內容大同小異,只是需要把 CMD 調整為執行該程式碼的指令。

# 使用 Python 3.11 作為 base image
FROM python:3.11-slim  
  
# 設置工作目錄  
WORKDIR /app  
  
# 複製當前目錄的內容到容器中的 /app 目錄  
COPY . .  
  
# 安裝 Python 依賴項  
# 如果有 requirements.txt 文件,使用它安裝依賴  
RUN pip install --no-cache-dir --upgrade pip && \  
    if [ -f requirements.txt ]; then pip install --no-cache-dir -r requirements.txt; fi  
  
# 指定要執行的命令  
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]

小結

補充一點指令設定的小知識。
跨平台開發或是運行的時候,可能會遇到平台相容性問題,這時候可以使用 buildx 處理。
依需求把 docker build 調整成

docker buildx build --platform linux/arm64

或是

docker buildx build --platform linux/amd64

就能夠正常運行囉!


上一篇
Day-3 在學習 Kubernetes 之前 - Docker(2)
下一篇
Day-5 Kubernetes
系列文
Kubernetes圖解筆記6
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言